/**
 * 异步任务线程池配置类
 * 配置Spring异步任务的线程池参数，用于处理@Async注解标记的异步方法
 * 继承AsyncConfigurerSupport以支持异步任务配置
 */
package cc.mrbird.febs.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Configuration: 标识这是一个配置类
 */
@Configuration
public class AsyncExecutorPoolConfig extends AsyncConfigurerSupport {

    /**
     * 配置异步任务线程池
     * 设置线程池的核心参数，包括：
     * 1. 核心线程数
     * 2. 最大线程数
     * 3. 队列容量
     * 4. 线程存活时间
     * 5. 线程名前缀
     * 6. 拒绝策略
     * @return 配置好的线程池执行器
     */
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        // 设置核心线程数，即线程池中保持的线程数量
        executor.setCorePoolSize(5);
        // 设置最大线程数，当核心线程数都在忙时，最多可以创建的线程数
        executor.setMaxPoolSize(20);
        // 设置队列容量，当核心线程数都在忙时，新任务会放入队列中等待
        executor.setQueueCapacity(100);
        // 设置线程存活时间（秒），超过核心线程数的线程在空闲时会自动销毁
        executor.setKeepAliveSeconds(30);
        // 设置线程名前缀，方便在日志中识别线程
        executor.setThreadNamePrefix("asyncTaskExecutor-");

        // 设置拒绝策略，当队列满且线程数达到最大值时，新任务由调用线程执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }
}